/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufrn.dca.identificacao;

/**
 * Classe que representa um sistema de 1ª ou 2ª com atraso de tempo
 *
 * @author allan
 */
public class Nopdt {

    /**
     * Ganho da planta
     */
    private double K;
    /**
     * Constante de tempo
     */
    private double tao;
    /**
     * Delay
     */
    private double delay;
    /**
     * Representa o tipo de sistema que será identificado
     */
    private tipoSistema tipo;
    /**
     * Ganho critico
     */
    private double Ku;
    /**
     * Periodo critico
     */
    private double Wu;

    public Nopdt() {
        this.K = 0;
        this.tao = 0;
        this.delay = 0;
    }

    /**
     * Identifica um sistema de Primeira Ordem com Atraso de Tempo
     *
     * @param u amplitude do relé
     * @param h valor de histerese
     * @param pu periodo de oscilação
     * @param a amplitude da oscilação
     * @param kp ganho estatico da planta
     */
    private void FOPDT(double u, double h, double pu, double a, double kp) {
        this.K = kp;

        Ku = (4 * u) / (Math.PI * (Math.sqrt(a * a - h * h)));
        Wu = (2 * Math.PI) / pu;

        this.tao = (1 / Wu) * (Math.sqrt((kp * Ku) * (kp * Ku) - 1));

        this.delay = (1 / Wu) * (Math.PI - Math.atan(Wu * tao));
    }

    /**
     * Identifica um sistema de Segunda Ordem com Atraso de Tempo
     *
     * @param u amplitude do relé
     * @param h valor de histerese
     * @param pu periodo de oscilação
     * @param a amplitude da oscilação
     * @param kp ganho estatico da planta
     */
    private void SOPDT(double u, double h, double pu, double a, double kp) {
        this.K = kp;

        Ku = (4 * u) / (Math.PI * (Math.sqrt(Math.pow(a, 2) - Math.pow(h, 2))));
        Wu = (2 * Math.PI) / pu;

        this.tao = (1 / Wu) * (Math.sqrt(kp * Ku - 1));
        this.delay = (1 / Wu) * (Math.PI - 2 * Math.atan(Wu * tao));
    }

    /**
     * Realiza a identificação com base no tipo de sistema passado
     *
     * @param u amplitude do relé
     * @param h valor de histerese
     * @param pu periodo de oscilação
     * @param a amplitude da oscilação
     * @param kp ganho estatico da planta
     */
    public void identificacao(double u, double h, double pu, double a, double kp) {
        if (tipo == tipoSistema.FOPDT) {
            FOPDT(u, h, pu, a, kp);
        } else {
            SOPDT(u, h, pu, a, kp);
        }
    }

    public double getK() {
        return K;
    }

    public void setK(double K) {
        this.K = K;
    }

    public double getTao() {
        return tao;
    }

    public void setTao(double tao) {
        this.tao = tao;
    }

    public double getDelay() {
        return delay;
    }

    public void setDelay(double delay) {
        this.delay = delay;
    }

    public tipoSistema getTipo() {
        return tipo;
    }

    public void setTipo(tipoSistema tipo) {
        this.tipo = tipo;
    }

    public double getKu() {
        return Ku;
    }

    public void setKu(double Ku) {
        this.Ku = Ku;
    }

    public double getWu() {
        return Wu;
    }

    public void setWu(double Wu) {
        this.Wu = Wu;
    }
}
